<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

/* auth:api：指的是使用 auth 中间件，但 guard 使用的是 config/auth.php 里配置的
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            // 'driver' => 'token',
            'driver' => 'passport',// 2025年7月24日23:35:00 手动添加
            'provider' => 'users',
            'hash' => false,
        ],
    ],
的 api 部分。
默认使用 token。
在安装了 passport 扩展后，改成了使用 passport。


在 API Authentication 部分，config/auth.php 配置有多个 guards，分别有自己的 driver 和 providers。
另外 Auth Facade (AuthManager) 提供了 Auth::guard() 方法用于决定 Auth 所使用的 guard。
Auth（Facade）提供了统一的方法来处理用户认证检测、驱动的扩展，通过更改配置而不是代码来使用不同的驱动。
Auth 内置了两种驱动的实现，AuthManager->createSessionDriver($name, $config), AuthManager->createTokenDriver($name, $config)。

如果你想更进一步了解 API Authentication 的运行过程，建议阅读一下 createTokenDriver() 内部实例化的 TokenGuard 类。
TokenGuard 会顺序检测 "query request"、"input request"、"header 键为 Authentication 值为 bearer xxx"，从中获取 token 值；接着根据配置中的 provider 的值创建 provider 具体实例来验证 token。
*/

// 浏览器中登录后访问，发现自动跳转到了首页。
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

// http://www.laravel71201.cm/api/test001
// 
// 有 middleware('auth:api')-> 的情况下：其他应用 Ajax 访问会报错未授权。
// 没有 middleware('auth:api')-> 的情况下：其他应用 Ajax 访问是成功的。
// 
// apiFox 访问的话，会发现需要登录。
// 浏览器中未登录访问：SQLSTATE[42S22]: Column not found: 1054 Unknown column 'api_token' in 'where clause' (SQL: select * from `tb_users` where `api_token` = 1qaz#EDC limit 1)
// 浏览器中未登录，ajax 访问，也是这个报错。
// 浏览器登录后：还是如此，因为 tb_users 数据表中确实没有这个 api_token 字段。
// 浏览器登录后，ajax 访问，也是这个报错。
//
// 添加了 api_token 后，
// 浏览器中已经登录的用户，ajax 访问，还是报错：未认证{"message":"Unauthenticated."}、未授权401 Unauthorized。
// 这是因为请求头里没有传递 api_token。
// 到底是 api_token 还是 Authorization: Bearer ...？【结论：Authorization】
// 不行
// 'api_token': 'fi7CJhCktQhqjs84fMPVO31q8krnANjl5iR4Qi2Kqtzj8w842ZBClQo1DJ4mpL2W'
// 不行
// 'api_token': 'Bearer fi7CJhCktQhqjs84fMPVO31q8krnANjl5iR4Qi2Kqtzj8w842ZBClQo1DJ4mpL2W'
// 不行
// 'api-token': 'fi7CJhCktQhqjs84fMPVO31q8krnANjl5iR4Qi2Kqtzj8w842ZBClQo1DJ4mpL2W'
// 不行
// 'api-token': 'Bearer fi7CJhCktQhqjs84fMPVO31q8krnANjl5iR4Qi2Kqtzj8w842ZBClQo1DJ4mpL2W'
// 成功
// 'Authorization': 'Bearer fi7CJhCktQhqjs84fMPVO31q8krnANjl5iR4Qi2Kqtzj8w842ZBClQo1DJ4mpL2W'
Route::middleware('auth:api')->get('/test001', function (Request $request) {
    return $request->url();
});

// 一次性的中间件
// 效果是：即使 ajax 请求，也会在浏览器中弹窗输入用户名（默认是 email）和密码，正确则返回响应。
// 虽然官方文档里写的 不需要 cookie 了，但这种方式也不好用啊~
Route::get('/test002', function (Request $request) {
    return $request->url();
})->middleware('auth.basic.once');


// 资源控制器的路由
Route::resource('menu', 'Api\MenuController');
